package settings

/*
	用于读取 config.yaml 配置文件
	Go 每日一库之 viper: https://juejin.cn/post/6844904051369312264#comment
*/

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	// viper 是适用于 Go 应用程序的完整配置解决方案
	"github.com/spf13/viper"
)

var Conf = new(AppConfig)

// AppConfig 里的信息和 config.yaml 里的配置信息相对应
type AppConfig struct {
	Mode         string `mapstructure:"mode"`
	Port         int    `mapstructure:"port"`
	Name         string `mapstructure:"name"`
	Version      string `mapstructure:"version"`
	StartTime    string `mapstructure:"start_time"`
	MachineID    int    `mapstructure:"machine_id"`
	*LogConfig   `mapstructure:"log"`
	*MySQLConfig `mapstructure:"mysql"`
}

type MySQLConfig struct {
	Host         string `mapstructure:"host"`
	User         string `mapstructure:"user"`
	Password     string `mapstructure:"password"`
	DB           string `mapstructure:"dbname"`
	Port         int    `mapstructure:"port"`
	MaxOpenConns int    `mapstructure:"max_open_conns"`
	MaxIdleConns int    `mapstructure:"max_idle_conns"`
}

type LogConfig struct {
	Level      string `mapstructure:"level"`
	Filename   string `mapstructure:"filename"`
	MaxSize    int    `mapstructure:"max_size"`
	MaxAge     int    `mapstructure:"max_age"`
	MaxBackups int    `mapstructure:"max_backups"`
}

func Init() error {
	viper.SetConfigFile("./conf/config.yaml")

	// 开启监听
	viper.WatchConfig()
	viper.OnConfigChange(func(fs fsnotify.Event) {
		fmt.Println("出事啦~配置文件被人修改啦: ", fs.Name)
		viper.Unmarshal(&Conf)
	})

	// 读配置文件
	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Errorf("ReadInConfig failed, err: %v", err))
	}

	fmt.Println("读取配置: 项目版本: version: ", viper.GetString("version"))
	fmt.Println("读取配置: mysql的host: ", viper.GetString("mysql.host"))

	// 将 config.yaml 中的配置信息放入到 Conf 中
	if err := viper.Unmarshal(&Conf); err != nil {
		panic(fmt.Errorf("unmarshal to Conf failed, err:%v", err))
	}
	return err
}
